package tester

//import (
//	"fmt"
//	"gitee.com/kristas/booting-go/framework/common/util/lang"
//	"gitee.com/kristas/booting-go/framework/core/bean"
//	"gitee.com/kristas/booting-go/framework/core/component"
//	"log"
//	"os"
//	"reflect"
//	"testing"
//)
//
//type TestRunner struct {
//	bean.Component
//	Testers []statement.Tester `wire:""`
//	t       *testing.T
//}
//
//func NewTestRunner() *TestRunner {
//	testing.Init()
//	return &TestRunner{
//		t: &testing.T{},
//	}
//}
//
//func (t *TestRunner) Order() int {
//	return 999
//}
//
//func (t *TestRunner) Run() error {
//	log.Println("Test Start")
//	errResult := make([][]string, 0)
//	var total int
//	for _, tester := range t.Testers {
//		m, results := t.doTests(tester)
//		total += m
//		if len(results) != 0 {
//			errResult = append(errResult, results)
//		}
//	}
//	if len(errResult) != 0 {
//		for _, r := range errResult {
//			log.Println(r)
//		}
//		log.Printf("[Failed] Test finished, failed: %d\n", len(errResult))
//	}
//	log.Println("[PASS] Test finished")
//	os.Exit(0)
//	return nil
//}
//
//func (t *TestRunner) doTests(tester statement.Tester) (int, []string) {
//	errs := make([]string, 0)
//	typ := reflect.TypeOf(tester)
//	val := reflect.ValueOf(tester)
//	for i := 0; i < typ.NumMethod(); i++ {
//		if isTestMethod(typ.Method(i)) {
//			err := tester.SetUp()
//			if err != nil {
//				errs = append(errs, fmt.Sprintf("Test failed when set up %s.%s: %s", bean.GetBeanName(tester), typ.Method(i).Name, err.Error()))
//			}
//
//			t.t.Run(typ.Method(i).Name, func(t *testing.T) {
//				values := val.Method(i).Call([]reflect.Value{reflect.ValueOf(t)})
//				if len(values) > 0 {
//					if result, ok := values[0].Interface().(error); ok {
//						errs = append(errs, fmt.Sprintf("Test failed %s.%s: %s", bean.GetBeanName(tester), typ.Method(i).Name, result.Error()))
//					}
//				}
//			})
//		}
//	}
//	return typ.NumMethod(), errs
//}
//
//func isTestMethod(method reflect.Method) bool {
//	return lang.NewString(method.Name).EndWith("Test")
//}
